// RAP [bm] AboutDialog left out for now
///*******************************************************************************
// * Copyright (c) 2000, 2009 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// * IBM Corporation - initial API and implementation
// *******************************************************************************/
//package org.eclipse.ui.internal.about;
//
//import java.io.File;
//import java.io.FileNotFoundException;
//import java.io.FileReader;
//import java.io.FileWriter;
//import java.io.IOException;
//import java.net.MalformedURLException;
//import java.net.URL;
//import java.util.ArrayList;
//import java.util.StringTokenizer;
//
//import org.eclipse.core.runtime.IPath;
//import org.eclipse.core.runtime.IStatus;
//import org.eclipse.core.runtime.Platform;
//import org.eclipse.jface.dialogs.MessageDialog;
//import org.eclipse.osgi.util.NLS;
//import org.eclipse.swt.widgets.Shell;
//import org.eclipse.ui.PartInitException;
//import org.eclipse.ui.PlatformUI;
//import org.eclipse.ui.browser.IWebBrowser;
//import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
//import org.eclipse.ui.internal.WorkbenchMessages;
//import org.eclipse.ui.internal.WorkbenchPlugin;
//import org.eclipse.ui.internal.misc.StatusUtil;
//import org.eclipse.ui.statushandlers.StatusManager;
//
///**
// * Manages links in styled text.
// */
//
//public class AboutUtils {
//
// private final static String ERROR_LOG_COPY_FILENAME = "log"; //$NON-NLS-1$
//
// /**
// * Scan the contents of the about text
// *
// * @param s
// * @return
// */
// public static AboutItem scan(String s) {
// ArrayList linkRanges = new ArrayList();
// ArrayList links = new ArrayList();
//
// // slightly modified version of jface url detection
// // see org.eclipse.jface.text.hyperlink.URLHyperlinkDetector
//
// int urlSeparatorOffset = s.indexOf("://"); //$NON-NLS-1$
// while (urlSeparatorOffset >= 0) {
//
// boolean startDoubleQuote = false;
//
// // URL protocol (left to "://")
// int urlOffset = urlSeparatorOffset;
// char ch;
// do {
// urlOffset--;
// ch = ' ';
// if (urlOffset > -1)
// ch = s.charAt(urlOffset);
// startDoubleQuote = ch == '"';
// } while (Character.isUnicodeIdentifierStart(ch));
// urlOffset++;
//
// // Right to "://"
// StringTokenizer tokenizer = new StringTokenizer(s
// .substring(urlSeparatorOffset + 3), " \t\n\r\f<>", false); //$NON-NLS-1$
// if (!tokenizer.hasMoreTokens())
// return null;
//
// int urlLength = tokenizer.nextToken().length() + 3
// + urlSeparatorOffset - urlOffset;
//
// if (startDoubleQuote) {
// int endOffset = -1;
// int nextDoubleQuote = s.indexOf('"', urlOffset);
// int nextWhitespace = s.indexOf(' ', urlOffset);
// if (nextDoubleQuote != -1 && nextWhitespace != -1)
// endOffset = Math.min(nextDoubleQuote, nextWhitespace);
// else if (nextDoubleQuote != -1)
// endOffset = nextDoubleQuote;
// else if (nextWhitespace != -1)
// endOffset = nextWhitespace;
// if (endOffset != -1)
// urlLength = endOffset - urlOffset;
// }
//
// linkRanges.add(new int[] { urlOffset, urlLength });
// links.add(s.substring(urlOffset, urlOffset + urlLength));
//
// urlSeparatorOffset = s.indexOf("://", urlOffset + urlLength + 1); //$NON-NLS-1$
// }
// return new AboutItem(s, (int[][]) linkRanges.toArray(new int[linkRanges
// .size()][2]), (String[]) links
// .toArray(new String[links.size()]));
// }
//
// /**
// * Open a browser with the argument title on the argument url. If the url
// * refers to a resource within a bundle, then a temp copy of the file will
// * be extracted and opened.
// *
// * @see <code>Platform.asLocalUrl</code>
// * @param url
// * The target url to be displayed, null will be safely ignored
// * @return true if the url was successfully displayed and false otherwise
// */
// public static boolean openBrowser(Shell shell, URL url) {
// if (url != null) {
// try {
// url = Platform.asLocalURL(url);
// } catch (IOException e) {
// return false;
// }
// }
// if (url == null) {
// return false;
// }
// openLink(shell, url.toString());
// return true;
// }
//
// /**
// * Open a link
// */
// public static void openLink(Shell shell, String href) {
// // format the href for an html file (file:///<filename.html>
// // required for Mac only.
// if (href.startsWith("file:")) { //$NON-NLS-1$
// href = href.substring(5);
// while (href.startsWith("/")) { //$NON-NLS-1$
// href = href.substring(1);
// }
// href = "file:///" + href; //$NON-NLS-1$
// }
// IWorkbenchBrowserSupport support = PlatformUI.getWorkbench()
// .getBrowserSupport();
// try {
// IWebBrowser browser = support.getExternalBrowser();
// browser.openURL(new URL(urlEncodeForSpaces(href.toCharArray())));
// } catch (MalformedURLException e) {
// openWebBrowserError(shell, href, e);
// } catch (PartInitException e) {
// openWebBrowserError(shell, href, e);
// }
// }
//
// /**
// * This method encodes the url, removes the spaces from the url and replaces
// * the same with <code>"%20"</code>. This method is required to fix Bug
// * 77840.
// *
// * @since 3.0.2
// */
// private static String urlEncodeForSpaces(char[] input) {
// StringBuffer retu = new StringBuffer(input.length);
// for (int i = 0; i < input.length; i++) {
// if (input[i] == ' ') {
// retu.append("%20"); //$NON-NLS-1$
// } else {
// retu.append(input[i]);
// }
// }
// return retu.toString();
// }
//
// /**
// * display an error message
// */
// private static void openWebBrowserError(Shell shell, final String href,
// final Throwable t) {
// String title = WorkbenchMessages.ProductInfoDialog_errorTitle;
// String msg = NLS.bind(
// WorkbenchMessages.ProductInfoDialog_unableToOpenWebBrowser,
// href);
// IStatus status = WorkbenchPlugin.getStatus(t);
// StatusUtil.handleStatus(status, title + ": " + msg, StatusManager.SHOW, //$NON-NLS-1$
// shell);
// }
//
// public static void openErrorLogBrowser(Shell shell) {
// String filename = Platform.getLogFileLocation().toOSString();
//
// File log = new File(filename);
// if (log.exists()) {
// // Make a copy of the file with a temporary name.
// // Working around an issue with windows file associations/browser
// // malfunction whereby the browser doesn't open on ".log" and we
// // aren't returned an error.
// // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=97783
// File logCopy = makeDisplayCopy(log);
// if (logCopy != null) {
// AboutUtils.openLink(shell,
// "file:///" + logCopy.getAbsolutePath()); //$NON-NLS-1$
// return;
// }
// // Couldn't make copy, try to open the original log.
// // We try the original in this case rather than putting up an error,
// // because the copy could fail due to an I/O or out of space
// // problem.
// // In that case we may still be able to show the original log,
// // depending on the platform. The risk is that users with
// // configurations that have bug #97783 will still get nothing
// // (vs. an error) but we'd rather
// // try again than put up an error dialog on platforms where the
// // ability to view the original log works just fine.
// AboutUtils.openLink(shell, "file:///" + filename); //$NON-NLS-1$
// return;
// }
// MessageDialog.openInformation(shell,
// WorkbenchMessages.AboutSystemDialog_noLogTitle, NLS.bind(
// WorkbenchMessages.AboutSystemDialog_noLogMessage,
// filename));
// }
//
// /**
// * Returns a copy of the given file to be used for display in a browser.
// *
// * @return the file, or <code>null</code>
// */
// private static File makeDisplayCopy(File file) {
// IPath path = WorkbenchPlugin.getDefault().getDataLocation();
// if (path == null) {
// return null;
// }
// path = path.append(ERROR_LOG_COPY_FILENAME);
// File copy = path.toFile();
// FileReader in = null;
// FileWriter out = null;
// try {
// in = new FileReader(file);
// // don't append data, overwrite what was there
// out = new FileWriter(copy);
// char buffer[] = new char[4096];
// int count;
// while ((count = in.read(buffer, 0, buffer.length)) > 0) {
// out.write(buffer, 0, count);
// }
// } catch (FileNotFoundException e) {
// return null;
// } catch (IOException e) {
// return null;
// } finally {
// try {
// if (in != null) {
// in.close();
// }
// if (out != null) {
// out.close();
// }
// } catch (IOException e) {
// return null;
// }
// }
// return copy;
//
// }
//
//}